STM32F4开发指南笔记48 您所在的位置:网站首页 stm32f4 freertos 没有静态内存吗 STM32F4开发指南笔记48

STM32F4开发指南笔记48

2024-06-01 12:05| 来源: 网络整理| 查看: 265

1、SDRAM控制原理

STM32控制器芯片内部有一定大小的SRAM和FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。 STM32F429系列芯片扩展内存时可以选择SRAM(静态内存,上电无需初始化)和SDRAM(动态内存,上电需初始化),由于SDRAM的性价比比较高,即使用SDRAM要比SRAM划算的多。我们以SDRAM为例讲解如何为STM32扩展内存。 给STM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32直接与SDRAM芯片连接。下图是一种型号为IS42-45S16400J的SDRAM芯片内部结构框图,以它为模型进行学习。本小节的SDRAM芯片为STM32扩展内存,它的行地址宽度为12位,列地址宽度为8位,内部含有4个bank,数据线宽度为16位,容量大小为8MB。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.1 SDRAM信号线 在这里插入图片描述

除了时钟、地址和数据线,控制SDRAM还需要很多信号配合,它们具体作用在描述时序图时进行讲解。

1.2 控制逻辑 SDRAM内部的“控制逻辑”指挥着整个系统的运行,外部可通过CS, WE, CAS, RAS以及地址线来向控制逻辑输入命令,命令经过“命令器译码器”译码,并将控制参数保存到“模式寄存器中”,控制逻辑依次运行。

1.3 地址控制 SDRAM包含有“A”以及“BA”2类地址线,A类地址线是行(Row)与列(Column)共用的地址总线,BA地址线是独立的用于指定SDRAM内部存储阵列号(bank)。在命令模式下,A类地址线还用于某些命令输入参数。

1.4 SDRAM的存储阵列 要了解SDRAM的存储单元寻址以及“A”、“BA”线的具体运用,需要先熟悉它内部存储阵列的结构。如下图 在这里插入图片描述

SDRAM内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上。和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格,这是SDRAM芯片寻址的基本原理。这样的每个单元格被称为“存储单元”,而这样的表则被称为“存储阵列(bank)”,目前设计的SDRAM芯片基本上内部都包含有4个这样的bank,寻址时指定bank号以及行地址,然后再指定列地址即可寻找到目标存储单元。SDRAM内部具有多个bank时的结构见下图: 在这里插入图片描述

SDRAM芯片向外部提供有独立的BA类地址线用于bank寻址,而行与列则共用A类地址线。 图中④表示的就是它内部的存储阵列结构,通讯时当RAS线为低电平,则“行地址选通器”被选通,地址线A[11:0]表示的地址会被输入到“行地址译码及锁存器”中,作为存储阵列中选定的行地址,同时地址线BA[1:0]表示的bank也被锁存,选中了要操作的bank号;接着控制CAS线为低电平,“列地址选通器”被选通,地址线A[11:0]表示的地址会被锁存到“列地址译码器”中作为列地址,完成寻址过程。

1.5 数据输入输出 若是写SDRAM内容,寻址完成后,DQ[15:0]线表示的数据经过⑤中的输入数据寄存器,然后传输到存储器阵列中,数据被保存;数据输出过程相反。 本型号的SDRAM存储阵列的“数据宽度”是16位(即数据线的数量),在与SDRAM进行数据通讯时,16位的数据是同步传输的,但实际应用中我们可能会以8位、16位的宽度存取数据,也就是说16位的数据线并不是所有时候都同时使用的,而且在传输低宽度数据的时候,我们不希望其他数据线表示的数据被录入。如传输8位数据的时候,我们只需要DQ[7:0]表示的数据,而DQ[15:8]数据线表示的数据必须忽略,否则会修改非目标存储空间的内容。所以数据输入输出时,还会使用DQM[1:0]线来配合,每个DQM线对应8位数据,如“DQM0(LDQM)”为低电平,“DQM1(HDQM)”为高电平时,数据线DQ[7:0]表示的数据有效,而DQ[15:8]表示的数据无效。

1.6 SDRAM的命令 控制SDRAM需要用到一系列的命令,各种信号线状态组合产生不同的控制命令。 在这里插入图片描述

命令禁止:只要CS引脚为高电平,即表示“命令禁止”(command inhibit),它用于禁止SDRAM执行新的命令,但它不能停止当前正在执行的命令。 空操作:“空操作”(no operation)是“命令禁止”的反操作,用于选中SDRAM,以便接下来发送命令。 行有效:进行存储单元寻址时,需要先选中要访问的bank和行,使它处于激活状态。该操作通过“行有效”(ACTIVE)命令实现,发送行有效命令时,RAS线为低电平,同时通过BA线以及A线发送bank地址和行地址。 在这里插入图片描述 列读写:行地址通过“行有效”命令确定后,就要对列地址进行寻址了。“读命令”(read)和“写命令”(write)的时序很相似,见下图,通过公用的地址线A发送列地址,同时使用WE引脚表示读/写方向,WE为低电平时表示写,高电平时表示读。数据读写时,使用DQM线表示有效的DQ数据线。 在这里插入图片描述

本型号的SDRAM芯片表示列地址时仅使用A[7:0]线,而A10线用于控制是否“自动预充电”,该线为高电平时使能,低电平时关闭。

预充电:SDRAM的寻址具有独占性,所以在进行完读写操作后,如果要对同一个bank的另一行进行寻址,就要将原来有效(ACTIVE)的行关闭,重新发送行/列地址。bank关闭当前工作行,准备打开新行的操作就是预充电(precharge)。预充电可以通过独立的命令控制,也可以在每次发送读写命令的同时使用“A10”线控制自动进行预充电。实际上,预充电是一种对工作行中所有存储阵列进行数据重写,并对行地址进行复位,以准备新行的工作。独立的预充电命令时序图如下,该命令配合使用A10线控制,若A10为高电平时,所有bank都预充电;A10为低电平时,使用BA线选择要预充电的bank。 在这里插入图片描述

刷新:SDRAM要不断进行刷新(refresh)才能保留住数据,因此它是DRAM最重要的操作。刷新操作与预充电中重写的操作本质是一样的。但因为预充电是对一个或所有bank中的工作行操作,并且不定期,而刷新则是有固定的周期,依次对所有行进行操作,以保证那些久久没有被访问的存储单元数据正确。刷新操作分为2种:“自动刷新(auto refresh)”与“自我刷新(self refresh)”,发送命令后CKE时钟为有效时(低电平),使用自动刷新操作,否则使用自我刷新操作。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于“自动刷新”,SDRAM内部有一个行地址生成器(也称为刷新计数器)用来自动地依次生成行地址,每收到一次命令刷新一行。在刷新过程中,所有bank都停止工作,而每次刷新所占用的时间为N个时钟周期(视SDRAM型号而定,通常为N=9),刷新结束之后才可进入正常的工作状态,也就是说在这N个时钟周期内所有工作指令只能等待而无法执行。一次次地按行刷新,刷新完所有行后,将再次对第一行重新进行刷新操作,这个对同一行刷新操作的时间间隔,称为SDRAM的刷新周期,通常为64ms。显然刷新会对SDRAM的性能造成影响,但这是它的DRAM(动态内存)的特性决定的,也是DRAM相对于SRAM取得成本优势的同时所付出的代价。“自我刷新”则主要用于休眠模式低功耗状态下的数据保存,也就是说即使外部控制器不工作了。SDRAM都能自己确保数据正常。在发出“自我刷新”命令后,将CKE置于无效状态(低电平),就进入自我刷新模式,此时不再依靠外部时钟工作,而是根据SDRAM内部的时钟进行刷新操作。在自我刷新期间除了CKE之外的所有外部信号都是无效的,只有重新使CKE有效才能退出自我刷新模式并进入正常操作状态。

加载模式寄存器:前面提到SDRAM的控制逻辑是根据他的模式寄存器来管理整个系统的,而这个寄存器的参数就是通过“加载模式寄存器”命令(LOAD MODE REGISTER)来配置的。发送该命令时,使用地址线表示要存入模式寄存器的参数“OP-Code”,各个地址线表示的参数如下图: 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、SDRAM的初始化流程

最后我们来了解SDRAM的初始化流程,SDRAM并不是上电后立即就可以开始读写数据的,它需要按步骤进行初始化,对存储矩阵预充电、刷新并设置模式寄存器,见下图。 在这里插入图片描述

该流程说明如下:

给SDRAM上电,并提供稳定的时钟,至少100us。 发送“空操作”(NOP)命令。 发送“预充电”(PRECHARGE)命令,控制所有bank进行预充电,并等待tRP时间,tRP表示预充电与其它命令之间的延迟。 发送至少2个“自动刷新”(AUTO REFRESH)命令,每个命令后需等待tRFC时间,tRFC表示自动刷新时间。 发送“加载模式寄存器”(LOAD MODE REGISTER)命令,配置SDRAM个工作参数,并等待tMRD时间,tMRD表示加载模式寄存器命令与行有效或刷新命令之间的延迟。 初始化流程完毕,可以开始读写数据。 其中tRP、tRFC、tMRD等时间参数跟具体的SDRAM有关,可查阅其数据手册获知,STM32 FMC访问时配置需要这些参数。 3、SDRAM的读写流程

初始化步骤完成,开始读写数据,其时序流程图如下 在这里插入图片描述

在这里插入图片描述

发送“行有效”(ACTIVE)命令,发送命令的同时包含行地址个bank地址,然后等待tRCD时间,tRCD表示行有效命令与读/写命令之间的延迟。 发送“读/写”(read/write)命令,在发送命令的同时发送列地址,完成寻址的地址输入。对于读命令,根据模式寄存器的CL定义,延迟CL个时钟周期后,SDRAM的数据线DQ才输出有效数据,而写命令是没有CL延迟的,主机在发送写命令的同时就可以把要写入的数据用DQ输入到SDRAM中,这时读命令与写命令的时序最主要的区别。图中的读/写命令都通过地址线A10控制自动预充电,而SDRAM接收到带预充电要求的读/写命令后,并不会立即预充电,而是等待tWR时间才开始,tWR表示写命令与预充电之间的延迟。 执行“预充电”(auto precharge)命令后,需要等待tRP时间,tRP表示预充电与其他命令之间的延迟。 图中④处的tRAS,表示自刷新周期,即在前一个“行有效”与“预充电”命令之间的时间。 发送第二次“行有效”(ACTIVE)命令准备读写下一个数据,在图中的⑤处的tRC,表示2个行有效命令或2个刷新命令之间的延迟。 其中tRCD、tWR、tRP、tRAS、tRC等时间参数跟具体的SDRAM有关,可查阅其数据手册获知,STM32 FMC访问时配置需要这些参数。 4、FMC简介

STM32F429使用FMC外设来管理扩展的存储器,FMC称为可变存储控制器。它可以用于驱动包括SRAM、SDRAM、NOR FLASH、NAND FLASH等类型的存储器。在其他系列的STM32控制器中,只有FSMC控制器(可变静态存储控制器),所以它们不能驱动SDRAM这样的动态存储器,因为驱动SDRAM时需要定时刷新,STM32F429的FMC外设才支持该功能,且只支持普通的SDRAM,不支持DDR类型的SDRAM。我们只讲述FMC的SDRAM控制功能。

5、FMC框图剖析

在这里插入图片描述

5.1 通讯引脚 在框图的右侧是FMC外设相关的控制引脚,由于控制不同类型存储器的时候会有一些不同的引脚,看起来非常多,其中地址线FMC_A和数据线FMC_D是所有控制器都共用的。这些FMC引脚具体对应的GPIO端口及引脚号可在《STM32F4XX规格书》中搜索查找到,不在此列出。针对SDRAM控制器,我们是整理出以下的FMC与SDRAM引脚对照表。 在这里插入图片描述

在这里插入图片描述

其中比较特殊的是FMC_A[15:14]引脚用作bank的寻址线;而FMC_SDCKE线和FMC_SDNE都各有2条,FMC_SDCKE用于控制SDRAM的时钟使能,FMC_SDNE用于控制SDRAM芯片的片选使能。它们用于控制STM32使用不同的存储区域驱动SDRAM,使用编号为0的信号线组会使用STM32的存储器区域1,使用编号为1的信号线会使用存储器区域2,。使用不同存储区域时,STM32访问SDRAM的地址不一样,具体将在“FMC的地址映射”小节讲解。

5.2 存储器控制器 上面不同类型的引脚是连接到FMC内部对应的存储控制器中的。NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器,而SDRAM存储器使用独立的控制器。不同的控制器有专用的寄存器用于配置其工作模式。 控制SDRAM的有FMC_SDCR1/FMC_SDCR2控制寄存器、FMC_SDTR1/FMC_SDTR2时序寄存器、FMC_SDCMR命令模式寄存器以及FMC_SDRTR刷新定时器寄存器。其中控制寄存器及时序寄存器各有2个,分别对应于SDRAM存储区域1和存储区域2的配置。 FMC_SDCR控制寄存器可配置SDCLK的同步时钟频率、突发读使能、写保护、CAS延迟、行列地址位数以及数据总线宽度等。 FMC_SDTR时序寄存器用于配置SDRAM访问时的各种时间延迟,如TRP行预充电延迟、TMRD加载模式寄存器激活延迟等。 FMC_SDCMR命令模式寄存器用于存储要发送到SDRAM模式寄存器的配置,以及要向SDRAM芯片发送的命令。 FMC_SDRTR用于配置SDRAM的自动刷新周期。

5.3 时钟控制逻辑 FMC外设挂载在AHB3总线上,时钟信号来自于HCLK(默认180MHZ),控制器的时钟输出就是由它分频得到。如SDRAM控制器的FMC_SDCLK引脚输出的时钟,是用于与SDRAM芯片进行同步通讯,它的时钟频率可通过FMC_SDCR1寄存器的SDCLK位配置,可以配置为HCLK的1/2或1/3,也就是说,与SDRAM通讯的同步时钟最高频率为90MHZ。

6、FMC的地址映射

FMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据,这种地址访问与IIC EEPROM、SPI FLASH的不一样,后2种方式都需要控制IIC或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令。而使用FMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。FMC的地址映射如下图。 在这里插入图片描述

图中左侧的是cortex-M4内核的存储空间分配,右侧是STM32 FMC外设的地址映射。可以看到FMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址都在external RAM地址空间内,而SDRAM的地址是分配到external device区域的。正是因为存在这样的地址映射,使得访问FMC控制的存储器时,就跟访问STM32的片上外设寄存器一样(片上外设的地址映射即图中左侧的“peripheral”区域)。

6.1 SDRAM的存储区域 FMC把SDRAM的存储区域分成了bank1和bank2两块,这里的bank与SDRAM芯片内部的bank是不一样的概念,只是FMC的地址区域划分而已。每个bank有不一样的起始地址,且有独立的FMC_SDCR控制寄存器和FMC_SDTR时序寄存器,还有独立的FMC_SDCKE时钟使能信号线和FMC_SDCLK信号线。FMC_SDCKE0和FMC_SDCLK0对应存储区域1的地址范围是0xC000000-0xCFFFFFFF,而FMC_SDCKE1和FMC_SDCLK1对应的存储区域2的地址范围是0xD0000000-0xDFFFFFFF 。 当程序里控制内核访问这些地址的存储空间时,FMC外设即会产生对应的时序,对它外接的SDRAM芯片进行读写。

6.2 external RAM和external device的区别 比较遗憾的是FMC给SDRAM分配的区域不在external RAM区,这个区域可以直接执行代码,而SDRAM所在的external device区却不支持这个功能。这里说的可直接执行代码的特性就是在“常用存储器”章节介绍的XIP(eXecute In Place)特性,即存储器上若存储了代码,CPU可直接访问代码执行,无需缓存到其他设备上再运行;而且XIP特性还对存储器的种类有要求,SRAM/SDRAM及NOR FLASH都支持这种特性,而NAND FLASH及PC卡是不支持XIP的。结合存储器的特性和STM32 FMC存储器种类的地址分配,就发现他的地址规划不合理了,NAND FLASH和PC卡这些不支持XIP的存储器却占据了 external RAM的空间,而支持XIP的SDRAM存储器的空间却被分配到了 external device区。 为了解决这个问题,通过配置“SYSCFG_MEMRMP”寄存器的“SWP_FMC”寄存器位可用于交换SDRAM与NAND/PC卡的地址映射,使得存储在SDRAM中的代码能被执行,只是由于SDRAM的最高同步时钟是90MHZ,代码的执行速度会受影响。

本章主要讲解当STM32的片内SRAM不够用时使用SDRAM扩展内存,但假如程序太大,它的程序空间FLASH不够用怎么办呢?首先是裁剪代码,目前STM32F429系列芯片内部FLASH空间最高可达2MB,实际应用中只要我们把代码中的图片、字模等占据大空间的内容放到外部存储器中,纯粹的代码很难达到2MB。如果还不够用,非要扩展程序空间的话,一种方法是使用FMC扩展NOR FLASH,把程序存储到NOR上,程序代码能够直接在NOR FLASH上执行。另一种方法是把程序存储在其他外部存储器,如SD卡,需要时把存储在SD卡上的代码加载到SRAM或SDRAM上,再在RAM上执行代码。

如果SDRAM不是用于存储可执行代码,只是用来保存数据的话,在 external RAM或 external device区域都没有区别,不需要与NAND的映射地址交换。

7、SDRAM时序结构体

控制FMC使用SDRAM存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的SDRAM时序结构体以及初始化结构体可以很方便地写入参数。 在这里插入图片描述

这个结构体成员定义的都是SDRAM发送各种命令后必须的延迟,它的配置对应到FMC_SDTR中的寄存器位。所有成员参数值的单位是周期,参数值大小都可以设置成“1-16”。关于这些延时时间的定义可以看“SDRAM初始化流程”和“SDRAM读写流程”小节的时序图了解。具体参数值根据SDRAM芯片的手册说明来配置。各成员介绍如下:

FMC_LoadToActiveDelay:本成员设置TMRD延迟(load mode register to active),即发送加载模式寄存器命令后要等待的时间,过了这段时间才可以发送行有效或刷新命令。 FMC_ExitSelfRefreshDelay:本成员设置退出TXSR延迟(exit self-refresh delay),即退出自我刷新命令后要等待的时间,过了这段时间才可以发送行有效命令。 FMC_SelfRefreshTime:本成员设置自我刷新时间TRAS,即发送行有效命令后要等待的时间,过了这段时间才执行预充电命令。 FMC_RowCycleDelay:本成员设置TRC延迟(row cycle delay),即两个行有效命令之间的延迟,以及两个相邻刷新命令之间的延迟。 FMC_WriteRecoveryTime:本成员设置TWR延迟(recovery delay),即写命令和预充电命令之间的延迟,等待这段时间后才开始执行预充电命令。 FMC_RPDelay:本成员设置TRP延迟(row precharge delay),即预充电命令与其他命令之间的延迟。 FMC_RCDDelay:本成员设置TRCD延迟(row to column delay),即行有效命令到列读写命令之间的延迟。

这个SDRAMTimingTypeDef时序结构体配置的延时参数,将作为下一节的FMC SDRAM初始化结构体的一个成员。

8、SDRAM初始化结构体

在这里插入图片描述

这个结构体,除最后一个成员是上一小节讲解的时序配置外,其他结构体成员的配置都对应到FMC_SDCR中的寄存器位。各个成员意义在前面的小节已有具体讲解,其可选参数介绍如下,括号中的是STM32标准库定义的宏:

FMC_Bank:本成员用于选择FMC映射的SDRAM存储区域,可选择存储区域1或2(FMC_Bank1/2_SDRAM)。 FMC_ColumnBitsNumber:本成员用于设置要控制的SDRAM的列地址宽度,可选择8-11位(FMC_ColumnBits_Number_8/9/10/11b)。 FMC_RowBitsNumber:本成员用于设置要控制的SDRAM的行地址宽度,可选择设置成11-13位(FMC_RowBits_Number_11/12/13b)。 FMC_SDMemoryDataWidth:本成员用于设置要控制的SDRAM的数据宽度,可选择设置成8、16或32位(FMC_SDMemory_Width_8/16/32b)。 FMC_InternalBankNumber:本成员用于设置要控制的SDRAM的内部bank数目,可选择设置成2或4个bank数目(FMC_InternalBank_Number_2/4),请注意区分这个结构体成员与FMC_Bank的区别。 FMC_CASLatency:本成员用于设置CASLatency即CL的时钟数目,可选择设置为1、2或3个时钟周期(FMC_CAS_Latency——1/2/3)。 FMC_WriteProtection:本成员用于设置是否使能写保护模式,如果使能了写保护则不能向SDRAM写入数据,正常使用都是禁止写保护的。 FMC_SDClockPeriod:本成员用于设置FMC与外部SDRAM通讯时的同步时钟参数,可以设置成STM32的HCLK时钟频率的1/2、1/3或禁止输出时钟(FMC_SDClock_Period_2/3或FMC_SDClock_Disable)。 FMC_ReadBurst:本成员用于设置是否使能突发读取模式,禁止时等效于BL=1,使能时BL的值等于模式寄存器中的配置. FMC_ReadPipeDelay :本成员用于配置在CASLatency个时钟周期后,再等待多少个HCLK时钟周期才进行数据采样,在确保正确的前提下,这个值设置为越短越好,可选择设置的参数值为0、1或2个HCLK时钟周期(FMC_ReadPipe_Delay_0/1/2). FMC_SDRAMTimingStruct:这个成员就是我们上一小节讲解的SDRAM时序结构体了,设置完时序结构体再把赋值到这里即可。

配置完SDRAM初始化结构体后,调用FMC_SDRAMInit函数把这些配置写入到FMC的SDRAM控制寄存器和时序寄存器,实现FMC的初始化。

9、SDRAM命令结构体

控制SDRAM时需要各种命令,通过向FMC的命令模式寄存器FMC_SDCMR写入控制参数,即可控制FMC对外发送命令,为了方便使用,STM32标准库也把它封装成了结构体。 在这里插入图片描述 命令结构体中的各个成员介绍如下:

FMC_CommandMode:本成员用于配置将要发送的命令,它可以被赋值为下表中的宏,这些宏代表了不同命令 在这里插入图片描述 FMC_CommandTarget:本成员用于选择要控制的FMC存储区域,可选择存储区域1或2(FMC_Command_Target_bank1/2)。 FMC_AutoRefreshNumber:有时需要连续发送多个“自动刷新”(auto refresh)命令时,配置本成员即可控制它发送多少次,可输入参数值为1-16,若发送的是其他命令,本参数值无效。如FMC_CommandMode成员被配置为宏FMC_Command_Mode_AutoRefresh,而FMC_Command_Mode_AutoRefresh被设置为2时,FMC就会控制发送2次自动刷新命令。 FMC_ModeRegisterDefinition:当向SDRAM发送加载模式寄存器命令时,这个结构体成员的值将通过地址线发送到SDRAM的模式寄存器中,这个成员值长度为13位,各个位一一对应SDRAM的模式寄存器。

配置完这些结构体成员,调用库函数FMC_SDRAMCmdConfig即可把这些参数写入到FMC_SDCMR寄存器中,然后FMC外设就会发送相应的命令了。

10、SDRAM初始化及接口函数 #include "./sdram/bsp_sdram.h" /** * @brief 延迟一段时间 * @param 延迟的时间长度 * @retval None */ static void SDRAM_delay(__IO uint32_t nCount) { __IO uint32_t index = 0; for(index = (100000 * nCount); index != 0; index--) { } } /** * @brief 初始化控制SDRAM的IO * @param 无 * @retval 无 */ static void SDRAM_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 使能SDRAM相关的GPIO时钟 */ /*地址信号线*/ RCC_AHB1PeriphClockCmd(FMC_A0_GPIO_CLK | FMC_A1_GPIO_CLK | FMC_A2_GPIO_CLK | FMC_A3_GPIO_CLK | FMC_A4_GPIO_CLK | FMC_A5_GPIO_CLK | FMC_A6_GPIO_CLK | FMC_A7_GPIO_CLK | FMC_A8_GPIO_CLK | FMC_A9_GPIO_CLK | FMC_A10_GPIO_CLK| FMC_A11_GPIO_CLK| FMC_BA0_GPIO_CLK| FMC_BA1_GPIO_CLK| /*数据信号线*/ FMC_D0_GPIO_CLK | FMC_D1_GPIO_CLK | FMC_D2_GPIO_CLK | FMC_D3_GPIO_CLK | FMC_D4_GPIO_CLK | FMC_D5_GPIO_CLK | FMC_D6_GPIO_CLK | FMC_D7_GPIO_CLK | FMC_D8_GPIO_CLK | FMC_D9_GPIO_CLK | FMC_D10_GPIO_CLK| FMC_D11_GPIO_CLK|


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有